package main

import "fmt"

func AddOne(n *int) {
	*n = *n + 1
}

type Man struct {
	Name string
	Age  int
}

func CreatInt() *int {
	//Go 编译器会自动把 x 从栈上逃逸到堆上，避免悬空指针。
	x := 100
	return &x
}

// 案例
func swap(a, b *int) {
	*a, *b = *b, *a
}

func main() {
	var a int = 10
	var p *int = &a // p 是指向a的指针

	fmt.Println("a = ", a)
	fmt.Println("p = ", p)
	fmt.Println("*p = ", *p)
	fmt.Println("&a = ", &a)

	var x int = 7
	AddOne(&x)
	fmt.Println(x) // 8

	m := &Man{"Tom", 23}
	fmt.Println(m.Name) // 自动解引用，等价于 (*p).Name
	m.Age = 490         // 自动解应用赋值
	fmt.Println(m.Age)  // 490

	i, j := 34, 89
	fmt.Printf("before i = %d, j = %d\n", i, j)
	swap(&i, &j)
	fmt.Printf("after i = %d, j = %d\n", i, j)

}
